package main

import "fmt"

func f1() (result int) {
	defer func() {
		result++
	}()
	return 1 // 等价于 result = 1; result ++; return
}

func f2() (result int) {
	t := 5
	defer func() {
		t = t + 5 //
	}()
	return t // 等价于 t:=5; result:=t; t=t+5; return
}

func f3() (t int) {
	t = 5
	defer func() {
		t = t + 5
	}()
	return t // 等价于t:=5; t=t+5; return
}

func f4() (r int) {
	defer func(t int) {
		t = t + 5
		fmt.Println("内部的值： ", t) //返回5,定义defer时参数值就确定下来了，为0
	}(r)
	return 1 // 等价于 r=1; return
}

func f5() (result int) {
	i := 1
	defer func() {
		result++
	}()
	return i // 等价于 i:= 1; result=i; result++; return
}

func f6() int { // 匿名的返回值
	var i int
	defer func() {
		i++
	}()
	return 1 // 等价于anony=1; return anony
}

func f7() int { // 匿名的返回值
	var i int
	defer func() {
		i++
	}()
	return i // 等价于i=0; anony=i; i++; return
}

func main() {
	fmt.Println(f1()) //2
	fmt.Println(f2()) //5
	fmt.Println(f3()) //10
	fmt.Println(f4()) //1
	fmt.Println(f5()) //2
	fmt.Println(f6()) //1
	fmt.Println(f7()) //1
}

//总结：return XXX 不是一条原子指令，可以拆解为 保存返回值->执行defer->执行return跳转，如f7()
